package org.linlinjava.litemall.admin.service;

import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.google.common.annotations.VisibleForTesting;
import lombok.RequiredArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import org.linlinjava.litemall.admin.beans.FormulaConstants;
import org.linlinjava.litemall.admin.errorcode.ErrorCodeConstants;
import org.linlinjava.litemall.core.exception.util.ServiceExceptionUtil;
import org.linlinjava.litemall.core.util.ResponseUtil;
import org.linlinjava.litemall.db.domain.LumiereFormula;
import org.linlinjava.litemall.db.domain.LumiereFormulaType;
import org.linlinjava.litemall.db.domain.LumiereMaterialClassification;
import org.linlinjava.litemall.db.domain.LumierePackage;
import org.linlinjava.litemall.db.service.LumiereFormulaService;
import org.linlinjava.litemall.db.service.LumiereFormulaTypeService;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.List;
import java.util.Optional;

/**
 * @auth :ply
 * @date 2024/5/14 15:22
 * @Description TODO
 * 管理配方类型服务
 */
@Service
@RequiredArgsConstructor
public class AdminLumiereFormulaTypeService {

    private final LumiereFormulaTypeService lumiereFormulaTypeService;

    private final LumiereFormulaService lumiereFormulaService;

    /**
     * 根据查询条件查询配方类型列表
     * @param lumiereFormulaType 查询条件
     * @param page 当前页数，默认为1
     * @param limit 每页数量，默认为10
     * @return 配方类型列表
     */
    public ResponseUtil.Response listLumiereFormulaType(LumiereFormulaType lumiereFormulaType, Integer page, Integer limit) {
        // 构建查询条件
        LambdaQueryWrapper<LumiereFormulaType> queryWrapper = new LambdaQueryWrapper<>();
        Optional.ofNullable(lumiereFormulaType.getFormulaTypeName())
                .filter(StringUtils::isNotEmpty)
                .ifPresent(name -> queryWrapper.like(LumiereFormulaType::getFormulaTypeName, name));

        queryWrapper.orderByAsc(LumiereFormulaType::getNumber);
        // 执行查询
        IPage<LumiereFormulaType> resultList = lumiereFormulaTypeService.page(new Page<>(page,limit),queryWrapper);

        // 返回结果
        return ResponseUtil.okPage(resultList);
    }

    /**
     * 根据指定ID获取配方类型详情。
     * @param id 配方类型ID
     * @return 包含配方类型详情的响应结果
     */
    public ResponseUtil.Response details(Integer id){
        return ResponseUtil.ok(lumiereFormulaTypeService.getById(id));
    }

    /**
     * 添加新的配方类型。
     * @param lumiereFormulaType 待添加的配方类型对象
     * @return 添加操作的响应结果
     */
    public ResponseUtil.Response addLumiereFormulaType(LumiereFormulaType lumiereFormulaType) {
        List<LumiereFormulaType> list = lumiereFormulaTypeService.list(null);
        // 使用Stream API检查是否存在相同名称的分类
        boolean exists = list.stream()
                .anyMatch(formulaType ->
                        formulaType.getFormulaTypeName().equals(lumiereFormulaType.getFormulaTypeName()));
        // 如果存在相同名称的分类，返回失败响应
        if (exists) {
            return ResponseUtil.fail(FormulaConstants.FORMULA_TYPE_NAME_EXISTING,"配方类型名称已存在");
        }
        return lumiereFormulaTypeService.save(lumiereFormulaType) ? ResponseUtil.ok() : ResponseUtil.fail();
    }

    /**
     * 更新配方类型信息。
     * @param lumiereFormulaType 待更新的配方类型对象
     * @return 更新操作的响应结果
     */
    public ResponseUtil.Response updateLumiereFormulaType(LumiereFormulaType lumiereFormulaType) {
        List<LumiereFormulaType> list = lumiereFormulaTypeService.list(Wrappers.lambdaQuery(LumiereFormulaType.class)
                .ne(LumiereFormulaType::getId,lumiereFormulaType.getId()));
        // 使用Stream API检查是否存在相同名称的分类
        boolean exists = list.stream()
                .anyMatch(formulaType ->
                        formulaType.getFormulaTypeName().equals(lumiereFormulaType.getFormulaTypeName()));
        // 如果存在相同名称的分类，返回失败响应
        if (exists) {
            return ResponseUtil.fail(FormulaConstants.FORMULA_TYPE_NAME_EXISTING,"配方类型名称已存在");
        }
        return lumiereFormulaTypeService.updateById(lumiereFormulaType) ? ResponseUtil.ok() : ResponseUtil.fail();
    }

    /**
     * 根据指定ID删除配方类型。
     * @param id 待删除的路配方类型ID
     * @return 删除操作的响应结果
     */
    public ResponseUtil.Response deleteLumiereFormulaType(Integer id){
        validateFormulaIsUse(id);
        return lumiereFormulaTypeService.removeById(id) ? ResponseUtil.ok() : ResponseUtil.fail();
    }

    @VisibleForTesting
    private void validateFormulaIsUse(Integer formulaTypeId){
        //是否有引用
        List<LumiereFormula> lumiereFormulaList = lumiereFormulaService.list(Wrappers.lambdaQuery(LumiereFormula.class)
                .eq(LumiereFormula::getFormulaTypeId, formulaTypeId));
        if(lumiereFormulaList.size()>0){
            throw ServiceExceptionUtil.exception(ErrorCodeConstants.LUMIERE_FORMULA_FORMULA_TYPE_IS_USE);
        }
    }


}
